﻿Imports System.Data




Public Class CServicioMonitorFL

Private Const __VALOR_DEFAULT__ As  Integer = -1
Private Const __MONTO_TOLERANCIA_REMAMENTE_MINIMO_X_FONDO__ As Decimal = 2000



#Region "MONITOR"



Public Function  CargarBSOMonitor(ByVal FechaConsulta As Date, ByRef sMsgError As String) as List(Of CTMonitorBSO)

      Try
          Dim lstBSOMonitor As new List(Of CTMonitorBSO )
          Dim dtBSO As DataTable  

              dtBSO =  CFLServicioLocalSQLServerDB.ObtenerBSOMonitor (FechaConsulta) 
                          
              For Each registro As DataRow In dtBSO.Rows

                  Dim bso = New CTMonitorBSO ()

                  bso.BSOId         = registro("ID_BSO")
                  bso.FecCreacion   = registro("FEC_CREACION")
                  bso.FecOperacion  = registro("FEC_OPERA")
                  bso.Estatus       = registro("ESTATUS")
                  bso.Gestor        = registro("NOMBRE")                                                                                                        
                  

                  

                  lstBSOMonitor.Add (bso) 

              Next
              

              Return lstBSOMonitor 

      Catch ex As Exception               
         sMsgError = ex.Message
         Return Nothing 
      End Try
     
End Function 


Public  Function ObtenerPSMonitorXBSO(ByVal idBSO As Long) As List(Of CTMonitorPS )
 Dim lstPS  = New  List(Of CTMonitorPS ) 
  
  Dim dtPS As DataTable  
 
     Try    
         dtPS =  CFLServicioLocalSQLServerDB.ObtenerPSMonitorXBSODB(idBSO)

         For Each registro As DataRow In dtPS.Rows
             Dim ps = new CTMonitorPS ()
            
             With ps

               .IdPS            = registro("ID_PARTIDA_PS")
               .Tvng            = registro("TVNG")
               .FecSol          = registro("FEC_SOLICITUD")
               .FecLiq          = registro("FEC_LIQUIDACION")
               .Plazo           = registro("PLAZO")
               .Comentario      = registro("COMENTARIO")
               .MontoSol        = registro("MONTO_SOL")
               .MontoAct        = registro("MONTO_ACTUAL")
               .Estatus         = registro("ESTATUS")
               .FecIngresoEjec  = registro("HORA_INGRESO")
               .FecEjec         = registro("HORA_EJECUCION")

               .IdEstatus       = registro ("ESTATUS_PARTIDA")
               
             End With
                 
              lstPS.Add (ps)

         Next    
    
         Return lstPS

     Catch ex As Exception  
       Return New  List(Of CTMonitorPS ) 
     End Try
    

End Function


Public  Function ObtenerPEJMonitorXPS(ByVal idPS As Long) As List(Of CTMonitorPEJ  )

Dim dtPEJ           As DataTable 
Dim lstMonitorPEJ   = new List(Of CTMonitorPEJ)

  Try
  
       dtPEJ = CFLServicioLocalSQLServerDB.ObtenerInfoGralPEJXPS (idPS) 
       For Each registro As DataRow In dtPEJ.Rows 
          
           Dim pejAux = New CTMonitorPEJ ()

           With pejAux

               .IdPEJ            = registro("ID_PARTIDA_EJ")
               .Intermediario    = registro("INTERMEDIARIO")
               .Flexible         = registro("FLEXIBLE")
               .Tasa             = registro("TASA")
               .MontoOriginal    = registro("MONTO_DISTRIB_ORI")
               .MontoDistribuido = registro("CANTIDAD_DISTRIB")
               .MontoXDistribuir = registro("CANTIDAD_X_DISTRIB")
               .Estatus          = registro("ESTATUS")
               .Medio            = registro("MEDIO")
               .Observaciones    = registro("OBSERVACIONES")

           End With
                    
           lstMonitorPEJ.Add (pejAux)
                                
       Next       

       Return lstMonitorPEJ


  Catch ex As Exception
     Return New List(Of CTMonitorPEJ) 
  End Try


End Function


Public  Function ObtenerDistribGralXPEJ(ByVal idPEJ As Long) As List(Of CTDistribucionGL)

Dim dtDistribGral           As DataTable 

Dim lstMonitorDistribGral   = new List(Of CTDistribucionGL )

  Try
  
       dtDistribGral = CFLServicioLocalSQLServerDB.ObtenerInfoGralDistribXPEJ (idPEJ) 
       For Each registro As DataRow In dtDistribGral.Rows 
          
           Dim distribAux = New CTDistribucionGL ()

           With distribAux

               .PartidaEJ   = registro ("ID_PARTIDA_EJ") 
               .SecDistrib  = registro("SEC_DISTRIB")
               .FecRegistro = registro("FEC_REGISTRO")
               .FolioOrden  = registro("FOLIO_ORDEN")
               .MontoTotal  = registro("CANTIDAD_DISTRIBUIDA")
               .EnviadoADecalog = registro("ENVIADO_DECALOG")
               .EstatusRecupFolDec = registro("ESTATUS_RECUP_FOLIO")
           End With
                    
           lstMonitorDistribGral.Add (distribAux)
                                
       Next       

       Return lstMonitorDistribGral


  Catch ex As Exception
     Return New List(Of CTDistribucionGL )
  End Try


End Function


Public  Function ObtenerPAJXPEJ(ByVal idPEJ As Long) As List(Of CTMonitorPAJ )

Dim dtMonitorPAJ           As DataTable 

Dim lstMonitorPAJ  = new List(Of CTMonitorPAJ )

  Try
  
       dtMonitorPAJ = CFLServicioLocalSQLServerDB.ObtenerPAJMonitorXPEJ(idPEJ) 
       For Each registro As DataRow In dtMonitorPAJ.Rows 
          
           Dim PajAux = New CTMonitorPAJ ()

           With PajAux

               .IDPAJ            = registro("ID_PARTIDA_AJUSTE")
               .Estatus          = registro("ESTATUS")
               .FecCreacion      = registro("FEC_CREACION")
               .FecAplicacion    = registro("FEC_APLICACION")
               .MontoAjuste      = registro("CANTIDAD_AJUS")
               .Comentario       = registro("COMENTARIO")
           End With
                    
           lstMonitorPAJ.Add (PajAux)
                                
       Next       

       Return lstMonitorPAJ


  Catch ex As Exception
     Return New List(Of CTMonitorPAJ )
  End Try


End Function


Public  Function ObtenerDistribDetXPEJDB(ByVal idPEJ As Long, ByVal secuencia as Integer) As List(Of CTMonitorDustribDetalleGL)

Dim dtDistribDet           As DataTable 

Dim lstMonitorDistribDet   = new List(Of CTMonitorDustribDetalleGL)

  Try
  
       dtDistribDet = CFLServicioLocalSQLServerDB.ObtenerInfoDistribDetalleXPEJ (idPEJ,secuencia) 
       For Each registro As DataRow In dtDistribDet.Rows 
          
           Dim distribAux = New CTMonitorDustribDetalleGL 

           With distribAux

               .Fondo        = registro("FONDO")
               .Monto        = registro("CANTIDAD")
               

           End With
                    
           lstMonitorDistribDet.Add (distribAux)
                                
       Next       

       Return lstMonitorDistribDet


  Catch ex As Exception
     Return new List(Of CTMonitorDustribDetalleGL)
  End Try


End Function



Public  Function ObtenerDiscribEstatusPS() As List(Of String )

Dim dtDescribestatusDet           As DataTable 

Dim lstDescribEstatus   = new List(Of string)

  Try
  
       dtDescribestatusDet = CFLServicioLocalSQLServerDB.ObtenerDescribEstatusPS ()
       For Each registro As DataRow In dtDescribestatusDet.Rows 

                 lstDescribEstatus.Add (registro("ESTATUS"))
            
       Next       

       Return lstDescribEstatus


  Catch ex As Exception
     Return new List(Of string)
  End Try


End Function


#End Region


#Region "EXPORTACIÓN DE INFORMACIÓN"


    Public Function ObtenerInformacionReporteNegocio(ByRef listNegocio As List(Of Integer), ByVal infoHist As Boolean) As DataTable

        Dim dtData As New DataTable()
        Dim dtFondos As New DataTable()

        Dim ToleranciaRemMinXFondo As Decimal
        Dim dtFondoSalDiso As New DataTable()
        Dim dtOrdenesPend As New DataTable()
        Dim dtPendingCashAndAjust As New DataTable()
        Dim strTipoActMinus As String = "PE-"
        Dim strTipoActPlus As String = "PE+"

        Dim lstFondos As List(Of CTFondoXIntermediario) = New List(Of CTFondoXIntermediario)
        Dim fondo As CTFondoXIntermediario
        dtFondos = CFLServicioLocalSQLServerDB.ObtieneFondosLiquidezNegocio(listNegocio)

        
        dtData.Columns.Add("Fondo")
        dtData.Columns.Add("Saldo disponible")
        dtData.Columns.Add("Ordenes pendientes")
        dtData.Columns.Add("Pending cash")
        dtData.Columns.Add("Pending cash adjust")
        dtData.Columns.Add("Saldos Decalog T")
        dtData.Columns.Add("Saldo Estimado")

        If infoHist Then
            For Each drFondo In dtFondos.Rows
                dtData.Rows.Add(drFondo.Item("FONDO"), 0, 0, 0, 0, 0, 0)
            Next
        Else

            For Each drFondo In dtFondos.Rows
                fondo = New CTFondoXIntermediario(drFondo.Item("FONDO"), Nothing, Nothing)
                lstFondos.Add(fondo)
            Next

            Try
                ToleranciaRemMinXFondo = Convert.ToDecimal(CServicioLocalSQLServerDB.ObtenerTolRemMinXFondo())
            Catch ex As Exception
                ToleranciaRemMinXFondo = __MONTO_TOLERANCIA_REMAMENTE_MINIMO_X_FONDO__
            End Try

            Try
                dtFondoSalDiso = CServiciosMacrosSyBaseDB.FondosSalLiquidezDB(lstFondos)
            Catch ex As Exception
                Throw ex
            End Try


            Dim ColumnaClavesOrd(0) As DataColumn
            Try

                dtOrdenesPend = CServiciosMacrosSyBaseDB.OrdenesPendLiquidezDB(lstFondos)
                ColumnaClavesOrd(0) = dtOrdenesPend.Columns("PFCOD")
                dtOrdenesPend.PrimaryKey = ColumnaClavesOrd
            Catch ex As Exception
                Throw ex
            End Try

            Dim ColumnaClaves(1) As DataColumn
            Try

                dtPendingCashAndAjust = CServiciosMacrosSyBaseDB.PendingCashAndAjustDB(lstFondos)
                ColumnaClaves(0) = dtPendingCashAndAjust.Columns("PF_COD")
                ColumnaClaves(1) = dtPendingCashAndAjust.Columns("XACT_TYP")
                dtPendingCashAndAjust.PrimaryKey = ColumnaClaves

            Catch ex As Exception
                Throw ex
            End Try

            Dim registro As DataRow
            Dim dblSaldo As Double = 0.0
            Dim dblPendingCash As Double = 0.0
            Dim dblPendingCashAjust As Double = 0.0
            Dim dblOrdPend As Double = 0.0
            Dim dblSalDecalog As Double = 0.0

            Try
                For Each registro In dtFondoSalDiso.Rows
                    Dim valores(1) As Object
                    Dim registrosMinus As DataRow
                    Dim registrosPlus As DataRow
                    Dim registroOrd As DataRow



                    'Busqueda de registros
                    valores(0) = registro.Item("fondo")
                    valores(1) = strTipoActMinus
                    registrosMinus = dtPendingCashAndAjust.Rows.Find(valores)

                    valores(1) = strTipoActPlus
                    registrosPlus = dtPendingCashAndAjust.Rows.Find(valores)

                    registroOrd = dtOrdenesPend.Rows.Find(registro.Item("fondo"))


                    'Validación en caso de no encontrar

                    If Not registro.Item("saldo") Is Nothing Then
                        dblSaldo = registro.Item("saldo")
                    End If


                    If Not registrosMinus Is Nothing Then
                        dblPendingCash = registrosMinus.Item("SALDOSPLUSMINUS")
                    End If

                    If Not registrosPlus Is Nothing Then
                        dblPendingCashAjust = registrosPlus.Item("SALDOSPLUSMINUS")
                    End If


                    If Not registroOrd Is Nothing Then
                        dblOrdPend = registroOrd.Item("ORDREPO")
                    End If


                    'PENDIENTE: VALIDAR SI registro.Item("saldo") puede ser NULL
                    dblSalDecalog = registro.Item("saldo") - dblOrdPend + dblPendingCash + dblPendingCashAjust


                    dtData.Rows.Add(registro.Item("fondo"), dblSaldo, dblOrdPend, dblPendingCash, dblPendingCashAjust, dblSalDecalog, dblSalDecalog - ToleranciaRemMinXFondo)


                    dblSaldo = 0.0
                    dblPendingCash = 0.0
                    dblPendingCashAjust = 0.0
                    dblOrdPend = 0.0
                    dblSalDecalog = 0.0
                Next
            Catch ex As Exception
                Throw ex
            End Try


        End If
        

        Return dtData
    End Function

    Public Function GenerarArchivo(ByVal fechaReporte As Date, ByRef dtFondos As DataTable, ByRef dtEncabezados As DataTable, ByRef dtLiquidez As DataTable, ByVal sRuta As String, ByVal sSufijo As String, ByRef sMsgError As String) As Boolean
        Dim sNombreArchivoAux As String
        If sRuta.Contains("xls") Then
            sRuta = sRuta.Replace(".xls", "")
            sRuta = sRuta.Replace(".XLS", "")
            sRuta = sRuta.Replace(".xlsx", "")
            sRuta = sRuta.Replace(".XLSX", "")
        Else
            sRuta = sRuta & CServicioLocalSQLServerDB.ObtieneNombreReporteLiquidez()
        End If

        Dim regData() As DataRow
        Dim xlsAplicacion As Microsoft.Office.Interop.Excel._Application
        Dim wbkLibro As Microsoft.Office.Interop.Excel.Workbook
        Dim shtHoja As Microsoft.Office.Interop.Excel.Worksheet
        Dim inicioRenglon As Integer
        Dim finalRenglon As Integer
        Dim countFile As Integer = 1
        Dim fechaHoy As Date = Date.Now
        Try
            Dim iteraciones As Integer = Convert.ToInt64((dtEncabezados.Rows.Count / 9).ToString().Split(".")(0))
            If iteraciones * 9 < dtEncabezados.Rows.Count Or dtEncabezados.Rows.Count = 0 Then
                iteraciones = iteraciones + 1
                Dim restantes = (iteraciones * 9) - dtEncabezados.Rows.Count
                For rest = 1 To restantes Step 1
                    dtEncabezados.Rows.Add("Intermediario " & rest)
                Next

            End If


            For it = 1 To iteraciones Step 1
                xlsAplicacion = CreateObject("Excel.Application")
                xlsAplicacion.SheetsInNewWorkbook = 1
                xlsAplicacion.DisplayAlerts = False
                xlsAplicacion.Visible = False

                wbkLibro = xlsAplicacion.Workbooks.Add
                shtHoja = wbkLibro.Sheets(1)
                inicioRenglon = 5
                shtHoja.Range("A3").Font.Size = 15
                shtHoja.Range("A3").Font.Bold = True
                shtHoja.Range("A3").Value = "Liquidación Decalog"
                shtHoja.Range("A3").HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter
                shtHoja.Range("A3:R3").Merge()

                shtHoja.Range("Q2:R2").Font.Bold = True
                shtHoja.Range("Q2").Value = "Fecha"
                shtHoja.Range("R2").Value = fechaHoy
                shtHoja.Range("R2").NumberFormat = "dd/MM/yyyy hh:mm:ss AM/PM"


                shtHoja.Range("A2:B2").Font.Bold = True
                shtHoja.Range("A2").Value = "Fecha Reporte"
                shtHoja.Range("B2").Value = fechaReporte
                shtHoja.Range("B2").NumberFormat = "dd/MM/yyyy"


                shtHoja.Range("A" & inicioRenglon & ":R" & inicioRenglon).Font.Bold = True
                shtHoja.Range("A" & inicioRenglon).Value = "Fondo"
                shtHoja.Range("B" & inicioRenglon).Value = "Saldo disponible"
                shtHoja.Range("C" & inicioRenglon).Value = "Ordenes pendientes"
                shtHoja.Range("D" & inicioRenglon).Value = "Pending cash"
                shtHoja.Range("E" & inicioRenglon).Value = "Pending cash adjust"
                shtHoja.Range("F" & inicioRenglon).Value = "Saldos Decalog T"
                shtHoja.Range("G" & inicioRenglon).Value = "Saldo Estimado"
                shtHoja.Range("H" & inicioRenglon).Value = dtEncabezados.Rows((it * 9) - 9).Item("intermediario")
                shtHoja.Range("I" & inicioRenglon).Value = dtEncabezados.Rows((it * 9) - 8).Item("intermediario")
                shtHoja.Range("J" & inicioRenglon).Value = dtEncabezados.Rows((it * 9) - 7).Item("intermediario")
                shtHoja.Range("K" & inicioRenglon).Value = dtEncabezados.Rows((it * 9) - 6).Item("intermediario")
                shtHoja.Range("L" & inicioRenglon).Value = dtEncabezados.Rows((it * 9) - 5).Item("intermediario")
                shtHoja.Range("M" & inicioRenglon).Value = dtEncabezados.Rows((it * 9) - 4).Item("intermediario")
                shtHoja.Range("N" & inicioRenglon).Value = dtEncabezados.Rows((it * 9) - 3).Item("intermediario")
                shtHoja.Range("O" & inicioRenglon).Value = dtEncabezados.Rows((it * 9) - 2).Item("intermediario")
                shtHoja.Range("P" & inicioRenglon).Value = dtEncabezados.Rows((it * 9) - 1).Item("intermediario")
                shtHoja.Range("Q" & inicioRenglon).Value = "Fecha liquidación"
                shtHoja.Range("R" & inicioRenglon).Value = "Fecha operación"

                inicioRenglon = inicioRenglon + 1
                For renglon = inicioRenglon To dtFondos.Rows.Count + inicioRenglon - 1 Step 1
                    shtHoja.Range("A" & renglon).Value = dtFondos.Rows(renglon - inicioRenglon).Item("Fondo")
                    shtHoja.Range("B" & renglon).Value = dtFondos.Rows(renglon - inicioRenglon).Item("Saldo disponible")
                    shtHoja.Range("C" & renglon).Value = dtFondos.Rows(renglon - inicioRenglon).Item("Ordenes pendientes")
                    shtHoja.Range("D" & renglon).Value = dtFondos.Rows(renglon - inicioRenglon).Item("Pending cash")
                    shtHoja.Range("E" & renglon).Value = dtFondos.Rows(renglon - inicioRenglon).Item("Pending cash adjust")
                    shtHoja.Range("F" & renglon).Value = dtFondos.Rows(renglon - inicioRenglon).Item("Saldos Decalog T")
                    shtHoja.Range("G" & renglon).Value = dtFondos.Rows(renglon - inicioRenglon).Item("Saldo Estimado")

                    shtHoja.Range("Q" & renglon).Value = fechaHoy
                    shtHoja.Range("R" & renglon).Value = fechaHoy

                    regData = dtLiquidez.Select("intermediario = '" + dtEncabezados.Rows((it * 9) - 9).Item("intermediario") + "' And fondo = '" + dtFondos.Rows(renglon - inicioRenglon).Item("Fondo") + "'")
                    If regData.Count > 0 Then
                        shtHoja.Range("H" & renglon).Value = regData(0)("total")
                        shtHoja.Range("Q" & renglon).Value = regData(0)("fecha_sol")
                        shtHoja.Range("R" & renglon).Value = regData(0)("fecha_liq")
                    Else
                        shtHoja.Range("H" & renglon).Value = 0
                    End If

                    regData = dtLiquidez.Select("intermediario = '" + dtEncabezados.Rows((it * 9) - 8).Item("intermediario") + "' And fondo = '" + dtFondos.Rows(renglon - inicioRenglon).Item("Fondo") + "'")
                    If regData.Count > 0 Then
                        shtHoja.Range("I" & renglon).Value = regData(0)("total")
                        shtHoja.Range("Q" & renglon).Value = regData(0)("fecha_sol")
                        shtHoja.Range("R" & renglon).Value = regData(0)("fecha_liq")
                    Else
                        shtHoja.Range("I" & renglon).Value = 0
                    End If

                    regData = dtLiquidez.Select("intermediario = '" + dtEncabezados.Rows((it * 9) - 7).Item("intermediario") + "' And fondo = '" + dtFondos.Rows(renglon - inicioRenglon).Item("Fondo") + "'")
                    If regData.Count > 0 Then
                        shtHoja.Range("J" & renglon).Value = regData(0)("total")
                        shtHoja.Range("Q" & renglon).Value = regData(0)("fecha_sol")
                        shtHoja.Range("R" & renglon).Value = regData(0)("fecha_liq")
                    Else
                        shtHoja.Range("J" & renglon).Value = 0
                    End If

                    regData = dtLiquidez.Select("intermediario = '" + dtEncabezados.Rows((it * 9) - 6).Item("intermediario") + "' And fondo = '" + dtFondos.Rows(renglon - inicioRenglon).Item("Fondo") + "'")
                    If regData.Count > 0 Then
                        shtHoja.Range("K" & renglon).Value = regData(0)("total")
                        shtHoja.Range("Q" & renglon).Value = regData(0)("fecha_sol")
                        shtHoja.Range("R" & renglon).Value = regData(0)("fecha_liq")
                    Else
                        shtHoja.Range("K" & renglon).Value = 0
                    End If

                    regData = dtLiquidez.Select("intermediario = '" + dtEncabezados.Rows((it * 9) - 5).Item("intermediario") + "' And fondo = '" + dtFondos.Rows(renglon - inicioRenglon).Item("Fondo") + "'")
                    If regData.Count > 0 Then
                        shtHoja.Range("L" & renglon).Value = regData(0)("total")
                        shtHoja.Range("Q" & renglon).Value = regData(0)("fecha_sol")
                        shtHoja.Range("R" & renglon).Value = regData(0)("fecha_liq")
                    Else
                        shtHoja.Range("L" & renglon).Value = 0
                    End If

                    regData = dtLiquidez.Select("intermediario = '" + dtEncabezados.Rows((it * 9) - 4).Item("intermediario") + "' And fondo = '" + dtFondos.Rows(renglon - inicioRenglon).Item("Fondo") + "'")
                    If regData.Count > 0 Then
                        shtHoja.Range("M" & renglon).Value = regData(0)("total")
                        shtHoja.Range("Q" & renglon).Value = regData(0)("fecha_sol")
                        shtHoja.Range("R" & renglon).Value = regData(0)("fecha_liq")
                    Else
                        shtHoja.Range("M" & renglon).Value = 0
                    End If

                    regData = dtLiquidez.Select("intermediario = '" + dtEncabezados.Rows((it * 9) - 3).Item("intermediario") + "' And fondo = '" + dtFondos.Rows(renglon - inicioRenglon).Item("Fondo") + "'")
                    If regData.Count > 0 Then
                        shtHoja.Range("N" & renglon).Value = regData(0)("total")
                        shtHoja.Range("Q" & renglon).Value = regData(0)("fecha_sol")
                        shtHoja.Range("R" & renglon).Value = regData(0)("fecha_liq")
                    Else
                        shtHoja.Range("N" & renglon).Value = 0
                    End If


                    regData = dtLiquidez.Select("intermediario = '" + dtEncabezados.Rows((it * 9) - 2).Item("intermediario") + "' And fondo = '" + dtFondos.Rows(renglon - inicioRenglon).Item("Fondo") + "'")
                    If regData.Count > 0 Then
                        shtHoja.Range("O" & renglon).Value = regData(0)("total")
                        shtHoja.Range("Q" & renglon).Value = regData(0)("fecha_sol")
                        shtHoja.Range("R" & renglon).Value = regData(0)("fecha_liq")
                    Else
                        shtHoja.Range("O" & renglon).Value = 0
                    End If

                    regData = dtLiquidez.Select("intermediario = '" + dtEncabezados.Rows((it * 9) - 1).Item("intermediario") + "' And fondo = '" + dtFondos.Rows(renglon - inicioRenglon).Item("Fondo") + "'")
                    If regData.Count > 0 Then
                        shtHoja.Range("P" & renglon).Value = regData(0)("total")
                        shtHoja.Range("Q" & renglon).Value = regData(0)("fecha_sol")
                        shtHoja.Range("R" & renglon).Value = regData(0)("fecha_liq")
                    Else
                        shtHoja.Range("P" & renglon).Value = 0
                    End If


                Next

                finalRenglon = dtFondos.Rows.Count + inicioRenglon + 1

                shtHoja.Range("A" & finalRenglon).Value = "TOTAL"
                shtHoja.Range("B" & finalRenglon).Value = "=SUM(B" & inicioRenglon & ":B" & finalRenglon - 2 & ")"
                shtHoja.Range("C" & finalRenglon).Value = "=SUM(C" & inicioRenglon & ":C" & finalRenglon - 2 & ")"
                shtHoja.Range("D" & finalRenglon).Value = "=SUM(D" & inicioRenglon & ":D" & finalRenglon - 2 & ")"
                shtHoja.Range("E" & finalRenglon).Value = "=SUM(E" & inicioRenglon & ":E" & finalRenglon - 2 & ")"
                shtHoja.Range("F" & finalRenglon).Value = "=SUM(F" & inicioRenglon & ":F" & finalRenglon - 2 & ")"
                shtHoja.Range("G" & finalRenglon).Value = "=SUM(G" & inicioRenglon & ":G" & finalRenglon - 2 & ")"
                shtHoja.Range("H" & finalRenglon).Value = "=SUM(H" & inicioRenglon & ":H" & finalRenglon - 2 & ")"
                shtHoja.Range("I" & finalRenglon).Value = "=SUM(I" & inicioRenglon & ":I" & finalRenglon - 2 & ")"
                shtHoja.Range("J" & finalRenglon).Value = "=SUM(J" & inicioRenglon & ":J" & finalRenglon - 2 & ")"
                shtHoja.Range("K" & finalRenglon).Value = "=SUM(K" & inicioRenglon & ":K" & finalRenglon - 2 & ")"
                shtHoja.Range("L" & finalRenglon).Value = "=SUM(L" & inicioRenglon & ":L" & finalRenglon - 2 & ")"
                shtHoja.Range("M" & finalRenglon).Value = "=SUM(M" & inicioRenglon & ":M" & finalRenglon - 2 & ")"
                shtHoja.Range("N" & finalRenglon).Value = "=SUM(N" & inicioRenglon & ":N" & finalRenglon - 2 & ")"
                shtHoja.Range("O" & finalRenglon).Value = "=SUM(O" & inicioRenglon & ":O" & finalRenglon - 2 & ")"
                shtHoja.Range("P" & finalRenglon).Value = "=SUM(P" & inicioRenglon & ":P" & finalRenglon - 2 & ")"

                shtHoja.Range("A" & finalRenglon & ":P" & finalRenglon).Font.Bold = True

                shtHoja.Range("B" & inicioRenglon & ":P" & finalRenglon).NumberFormat = "##,##0.00"
                shtHoja.Range("Q" & inicioRenglon & ":R" & finalRenglon).NumberFormat = "dd/MM/yyyy"
                shtHoja.Range("Q" & inicioRenglon & ":R" & finalRenglon).HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlRight
                shtHoja.Range("A" & inicioRenglon & ":R" & finalRenglon).EntireColumn.AutoFit()
                shtHoja.Range("B2").EntireColumn.AutoFit()
                shtHoja.Range("B2").ColumnWidth = shtHoja.Range("B2").ColumnWidth + 5
                shtHoja.Range("R2").ColumnWidth = shtHoja.Range("R2").ColumnWidth + 5
                sNombreArchivoAux = sRuta & "_" & sSufijo & countFile & "_" & fechaHoy.ToString("yyyyMMdd") & "_" & fechaHoy.ToString("hhmmss") & ".xls"

                wbkLibro.SaveAs(sNombreArchivoAux, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, Type.Missing, _
                     Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, _
                     Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing)

                ReleaseObject(shtHoja)
                wbkLibro.Close(False, Type.Missing, Type.Missing)
                ReleaseObject(wbkLibro)
                xlsAplicacion.Quit()
                ReleaseObject(xlsAplicacion)
                GC.Collect()
                countFile = countFile + 1
            Next

            Return True



        Catch ex As Exception
            sMsgError = ex.Message
            Return False
        End Try

    End Function

    Public Function ExportarReporteLiqExcel(ByVal negocio As String, ByVal fecha As Date, ByVal sRuta As String, ByRef sMsgError As String) As Boolean

        Dim infoHist As Boolean = False
        Dim lstNegocio As New List(Of Integer)
        Dim dtEncabezados As DataTable
        Dim dtLiquidez As DataTable
        Try
            If fecha.ToString("dd/MM/yyyy") <> Date.Now.ToString("dd/MM/yyyy") Then
                infoHist = True
            End If
            If negocio = "FONDOS" Then
                lstNegocio.Add(CTFondoTVNG.enumTipoNegocio.GUBER_FONDOS_RV)
                lstNegocio.Add(CTFondoTVNG.enumTipoNegocio.GUBER_FONDOS_DEUDA)
                lstNegocio.Add(CTFondoTVNG.enumTipoNegocio.BANCARIO_FONDOS_RV)
                lstNegocio.Add(CTFondoTVNG.enumTipoNegocio.BANCARIO_FONDOS_DEUDA)
                Dim dtFondos As DataTable = ObtenerInformacionReporteNegocio(lstNegocio, infoHist)
                dtEncabezados = CFLServicioLocalSQLServerDB.ObtieneEncabezadosInterm(lstNegocio, fecha.ToString("dd/MM/yyyy"))
                dtLiquidez = CFLServicioLocalSQLServerDB.ObtieneLiqInterm(lstNegocio, fecha.ToString("dd/MM/yyyy"))
                GenerarArchivo(fecha, dtFondos, dtEncabezados, dtLiquidez, sRuta, "FONDOS", sMsgError)
            Else
                lstNegocio = New List(Of Integer)
                lstNegocio.Add(CTFondoTVNG.enumTipoNegocio.GUBER_PORVENIR)
                lstNegocio.Add(CTFondoTVNG.enumTipoNegocio.BANCARIO_PORVENIR)
                Dim dtPorvenir As DataTable = ObtenerInformacionReporteNegocio(lstNegocio, infoHist)
                dtEncabezados = CFLServicioLocalSQLServerDB.ObtieneEncabezadosInterm(lstNegocio, fecha.ToString("dd/MM/yyyy"))
                dtLiquidez = CFLServicioLocalSQLServerDB.ObtieneLiqInterm(lstNegocio, fecha.ToString("dd/MM/yyyy"))
                GenerarArchivo(fecha, dtPorvenir, dtEncabezados, dtLiquidez, sRuta, "PORVENIR", sMsgError)

            End If

            Return True



        Catch ex As Exception
            sMsgError = ex.Message
            Return False
        End Try


    End Function

    Public Function ExportarInfoAExcel(ByVal FecIni As Date, ByVal FecFin As Date, ByVal sNombreArchivo As String, ByRef MascaraActiva(,) As Byte, ByRef sMsgError As String) As Boolean

        Dim dtBSO As DataTable = Nothing
        Dim dtPS As DataTable = Nothing
        Dim dtPEJ As DataTable = Nothing
        Dim dtPAJ As DataTable = Nothing
        Dim dtDistrib As DataTable = Nothing
        Dim dtDistribFI As DataTable = Nothing


        Dim xlsAplicacion As Microsoft.Office.Interop.Excel._Application
        Dim wbkLibro As Microsoft.Office.Interop.Excel.Workbook
        Dim shtHoja As Microsoft.Office.Interop.Excel.Worksheet

        Dim numRegActualExcel As Long = 1





        If MascaraActiva(FLMonitor.FuncExp.BSO, 1) = FLMonitor.Activador.Activado Then
            dtBSO = ObtenerInformacionExpDB(FLMonitor.FuncExp.BSO, FecIni, FecFin)
        End If

        If MascaraActiva(FLMonitor.FuncExp.PS, 1) = FLMonitor.Activador.Activado Then
            dtPS = ObtenerInformacionExpDB(FLMonitor.FuncExp.PS, FecIni, FecFin)
        End If

        If MascaraActiva(FLMonitor.FuncExp.PEJ, 1) = FLMonitor.Activador.Activado Then
            dtPEJ = ObtenerInformacionExpDB(FLMonitor.FuncExp.PEJ, FecIni, FecFin)
        End If

        If MascaraActiva(FLMonitor.FuncExp.PAJ, 1) = FLMonitor.Activador.Activado Then
            dtPAJ = ObtenerInformacionExpDB(FLMonitor.FuncExp.PAJ, FecIni, FecFin)
        End If

        If MascaraActiva(FLMonitor.FuncExp.Distrib, 1) = FLMonitor.Activador.Activado Then
            dtDistrib = ObtenerInformacionExpDB(FLMonitor.FuncExp.Distrib, FecIni, FecFin)
        End If

        If MascaraActiva(FLMonitor.FuncExp.DistribFondoImporte, 1) = FLMonitor.Activador.Activado Then
            dtDistribFI = ObtenerInformacionExpDB(FLMonitor.FuncExp.DistribFondoImporte, FecIni, FecFin)
        End If




        Try
            xlsAplicacion = CreateObject("Excel.Application")
            xlsAplicacion.SheetsInNewWorkbook = 1
            xlsAplicacion.DisplayAlerts = False
            xlsAplicacion.Visible = False

            wbkLibro = xlsAplicacion.Workbooks.Add
            shtHoja = wbkLibro.Sheets(1)

        Catch ex As Exception
            sMsgError = ex.Message
            Return False
        End Try




        Try


            'Grabar Cabecera BSO
            GrabarCabecera(shtHoja, dtBSO, MascaraActiva(FLMonitor.FuncExp.BSO, 0), numRegActualExcel)
            For Each regBSO As DataRow In dtBSO.Rows
                'Grabar Dato BSO
                numRegActualExcel += 1
                GrabarDatos(shtHoja, regBSO, MascaraActiva(FLMonitor.FuncExp.BSO, 0), numRegActualExcel, dtBSO.Columns.Count)
            Next



            numRegActualExcel += 2
            If MascaraActiva(FLMonitor.FuncExp.PS, 1) = FLMonitor.Activador.Activado Then
                'Grabar Cabecera PS            
                If dtPS.Columns.Count > 0 Then
                    numRegActualExcel += 1
                    GrabarCabecera(shtHoja, dtPS, MascaraActiva(FLMonitor.FuncExp.PS, 0), numRegActualExcel)

                    For Each regPS As DataRow In dtPS.Rows
                        'Grabar Dato PS
                        numRegActualExcel += 1
                        GrabarDatos(shtHoja, regPS, MascaraActiva(FLMonitor.FuncExp.PS, 0), numRegActualExcel, dtPS.Columns.Count)
                    Next

                End If

            End If


            numRegActualExcel += 2
            If MascaraActiva(FLMonitor.FuncExp.PEJ, 1) = FLMonitor.Activador.Activado Then


                If dtPEJ.Columns.Count > 0 Then
                    'Grabar Cabecera PEJ       
                    numRegActualExcel += 1
                    GrabarCabecera(shtHoja, dtPEJ, MascaraActiva(FLMonitor.FuncExp.PEJ, 0), numRegActualExcel)



                    Dim idPS As Long = __VALOR_DEFAULT__
                    For Each regPEJ As DataRow In dtPEJ.Rows

                        If idPS <> __VALOR_DEFAULT__ And idPS <> regPEJ("ID_PARTIDA_PS") Then
                            numRegActualExcel += 1
                        End If

                        'Grabar Dato PEJ
                        numRegActualExcel += 1
                        GrabarDatos(shtHoja, regPEJ, MascaraActiva(FLMonitor.FuncExp.PEJ, 0), numRegActualExcel, dtPEJ.Columns.Count)

                        idPS = regPEJ("ID_PARTIDA_PS")
                    Next
                End If

            End If


            numRegActualExcel += 2
            If MascaraActiva(FLMonitor.FuncExp.PAJ, 1) = FLMonitor.Activador.Activado Then

                If dtPAJ.Columns.Count > 0 Then
                    'Grabar Cabecera PAJ       
                    numRegActualExcel += 1
                    GrabarCabecera(shtHoja, dtPAJ, MascaraActiva(FLMonitor.FuncExp.PAJ, 0), numRegActualExcel)



                    Dim idPEJ As Long = __VALOR_DEFAULT__
                    For Each regPAJ As DataRow In dtPAJ.Rows
                        If idPEJ <> __VALOR_DEFAULT__ And idPEJ <> regPAJ("ID_PARTIDA_EJ") Then
                            numRegActualExcel += 1
                        End If

                        'Grabar Dato PAJ
                        numRegActualExcel += 1
                        GrabarDatos(shtHoja, regPAJ, MascaraActiva(FLMonitor.FuncExp.PAJ, 0), numRegActualExcel, dtPAJ.Columns.Count)

                        idPEJ = regPAJ("ID_PARTIDA_EJ")
                    Next
                End If


            End If



            numRegActualExcel += 2
            If MascaraActiva(FLMonitor.FuncExp.Distrib, 1) = FLMonitor.Activador.Activado Then
                If dtDistrib.Columns.Count > 0 Then
                    numRegActualExcel += 1
                    GrabarCabecera(shtHoja, dtDistrib, MascaraActiva(FLMonitor.FuncExp.Distrib, 0), numRegActualExcel)

                    For Each regDistrib As DataRow In dtDistrib.Rows
                        numRegActualExcel += 1
                        GrabarDatos(shtHoja, regDistrib, MascaraActiva(FLMonitor.FuncExp.Distrib, 0), numRegActualExcel, dtDistrib.Columns.Count)
                    Next
                End If
            End If



            numRegActualExcel += 2
            If MascaraActiva(FLMonitor.FuncExp.DistribFondoImporte, 1) = FLMonitor.Activador.Activado Then

                If dtDistribFI.Columns.Count > 0 Then
                    numRegActualExcel += 1
                    GrabarCabecera(shtHoja, dtDistribFI, MascaraActiva(FLMonitor.FuncExp.DistribFondoImporte, 0), numRegActualExcel)



                    Dim idPEJ As Long = __VALOR_DEFAULT__
                    Dim idSec As Long = __VALOR_DEFAULT__
                    For Each regDistribImporte As DataRow In dtDistribFI.Rows
                        If (idPEJ <> __VALOR_DEFAULT__ And idSec <> __VALOR_DEFAULT__) And (idPEJ <> regDistribImporte("ID_PARTIDA_EJ") Or idSec <> regDistribImporte("SEC_DISTRIB")) Then
                            numRegActualExcel += 1
                        End If


                        numRegActualExcel += 1
                        GrabarDatos(shtHoja, regDistribImporte, MascaraActiva(FLMonitor.FuncExp.DistribFondoImporte, 0), numRegActualExcel, dtDistribFI.Columns.Count)

                        idPEJ = regDistribImporte("ID_PARTIDA_EJ")
                        idSec = regDistribImporte("SEC_DISTRIB")

                    Next


                End If

            End If



            wbkLibro.SaveAs(sNombreArchivo, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal)





        Catch ex As Exception

            Return False

        Finally

            ReleaseObject(shtHoja)
            wbkLibro.Close(False, Type.Missing, Type.Missing)
            ReleaseObject(wbkLibro)
            xlsAplicacion.Quit()
            ReleaseObject(xlsAplicacion)
            GC.Collect()

        End Try




        Return True

    End Function

    Public Sub ReleaseObject(ByVal o As Object)
        Try
            While (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0)
            End While
        Catch
        Finally
            o = Nothing
        End Try
    End Sub


    Private Sub GrabarCabecera(ByRef shtHoja As Microsoft.Office.Interop.Excel.Worksheet, ByRef dt As DataTable, ByVal columnaInicio As Long, ByVal registoActual As Long)
        Dim i As Long = columnaInicio
        Dim j As Integer = 0

        If dt.Columns.Count > 0 Then
            For j = 0 To dt.Columns.Count - 1
                shtHoja.Cells(registoActual, i) = dt.Columns(j).ColumnName
                i += 1
            Next
        End If


        Dim celdaInicio As String = "A"
        Select Case columnaInicio

            Case 1
                celdaInicio = "A"
            Case 2
                celdaInicio = "B"
            Case 3
                celdaInicio = "C"
            Case 4
                celdaInicio = "D"
            Case 5
                celdaInicio = "E"
            Case 6
                celdaInicio = "F"

        End Select

        shtHoja.Range(celdaInicio & registoActual & ":" & "N" & registoActual).Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Gray)
        shtHoja.Range(celdaInicio & registoActual & ":" & "N" & registoActual).Font.Bold = True
        shtHoja.Range(celdaInicio & registoActual & ":" & "N" & registoActual).Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.White)


    End Sub

    Private Sub GrabarDatos(ByRef shtHoja As Microsoft.Office.Interop.Excel.Worksheet, ByRef reg As DataRow, ByVal columnaInicio As Long, ByVal registoActual As Long, ByVal numColumnas As Integer)
        Dim i As Long = columnaInicio
        Dim j As Integer = 0

        For j = 0 To numColumnas - 1
            shtHoja.Cells(registoActual, i) = If(IsDBNull(reg.Item(j)), "", reg.Item(j)).ToString
            i += 1
        Next


    End Sub




    Private Function ObtenerInformacionExpDB(ByVal opcion As Byte, ByVal fecIni As Date, ByVal fecFin As Date) As DataTable

        Select Case opcion

            Case FLMonitor.FuncExp.BSO
                Return CFLServicioLocalSQLServerDB.ObtenerBSOInfoExp(fecIni, fecFin)
            Case FLMonitor.FuncExp.PS
                Return CFLServicioLocalSQLServerDB.ObtenerPSInfoExp(fecIni, fecFin)
            Case FLMonitor.FuncExp.PEJ
                Return CFLServicioLocalSQLServerDB.ObtenerPEJInfoExp(fecIni, fecFin)
            Case FLMonitor.FuncExp.PAJ
                Return CFLServicioLocalSQLServerDB.ObtenerPAJInfoExp(fecIni, fecFin)
            Case FLMonitor.FuncExp.Distrib
                Return CFLServicioLocalSQLServerDB.ObtenerDistribInfoExp(fecIni, fecFin)
            Case FLMonitor.FuncExp.DistribFondoImporte
                Return CFLServicioLocalSQLServerDB.ObtenerDistribFIInfoExp(fecIni, fecFin)
            Case Else
                Return New DataTable
        End Select

    End Function




#End Region


#Region "REENVIO DISTRIBUCION DECALOG"
    Public Sub ReactivarDistribucion(ByVal idPs As Integer, ByVal idPej As Integer, ByVal Sec As Integer)
        Dim sMsgError As String = ""
        If CFLServicioLocalSQLServerDB.ReactivarDistribucion(idPs, idPej, Sec, sMsgError) = False Then
           Throw New Exception(sMsgError)
        End If
    End Sub
#End Region





End Class
